



import bpy
from bpy.types import Operator

import 全局控制.Node.节点和插座基类.bl_节点基类 as 基类
import 全局控制.Node.插座.bl_插座基类 as 插座基类

import math


E_类型枚举 = [
	("TYPE_sqrt", "sqrt", "", 0),
	
	("TYPE_pow", "pow", "返回 x 的 y 次方", 1),

	("TYPE_exp", "exp", "", 2),
	("TYPE_exp2", "exp2", "", 3),
	
	("TYPE_log", "log", "", 4),
	("TYPE_log2", "log2", "", 5),

	("TYPE_inversesqrt", "inversesqrt", "", 6),

]






class C_Node_指数函数(基类.C_SN_基类):
	bl_dname = 'bl_node_指数函数'
	bl_label = '指数函数'
	
	m_运算类型 = bpy.props.EnumProperty(items = E_类型枚举, name="函数", default="TYPE_sqrt" )
	def init(self, context):
		super(C_Node_指数函数, self).f_init(context)
		self.inputs.new('C_NodeSocket_f', name='A')
		self.inputs.new('C_NodeSocket_f', name='B')
		self.outputs.new('C_NodeSocket_f', name='C')
		
	def draw_buttons(self, context, layout):
		layout.prop(self, 'm_运算类型')

	def f_update(self, 是否向下传递=False, input插座=None):
		AValue = 插座基类.f_取列表单值(self.inputs['A'].f_getData())
		BValue = 插座基类.f_取列表单值(self.inputs['B'].f_getData())
		#print('self.inputs[].f_getData() = ', type(self.inputs['B'].f_getData()))
		#print(' f_update self.m_运算类型 == ', AValue, BValue)
		if self.m_运算类型 == 'TYPE_sqrt' :
			value = math.sqrt(AValue)
		elif self.m_运算类型 == 'TYPE_pow' :
			value = math.pow(AValue, BValue)
		elif self.m_运算类型 == 'TYPE_exp' :
			value = math.exp(AValue)
		elif self.m_运算类型 == 'TYPE_log' :
			value = math.log(AValue)
		elif self.m_运算类型 == 'TYPE_log2' :
			value = math.log2(AValue)
		#elif self.m_运算类型 == 'TYPE_inversesqrt' :
		#	value = math.log2(AValue)
		
		self.outputs[0].f_setData(value)
		super(C_Node_指数函数, self).f_update(是否向下传递, input插座)
		

	def f_input插座Update(self, input插座, 上层Output=None):
		if input插座 :
			v = input插座.f_getData()
			input插座.f_setData(v)
		super(C_Node_指数函数, self).f_input插座Update(input插座, 上层Output)

class C_NODE_AddMenu_指数函数(bpy.types.Operator):
	bl_idname = 'node.global_node_exponent'
	bl_label = '指数函数'
	bl_options = {'REGISTER', 'UNDO'}
	
	def execute(operator, context):
		operator.use_transform = True
		bpy.ops.node.add_node(type='C_Node_指数函数', use_transform=True)
		return {'FINISHED'}



classes = (
	C_Node_指数函数,
	C_NODE_AddMenu_指数函数,
	
)

def register():
	for c in classes:
		bpy.utils.register_class(c)
		
def unregister():
	for c in classes:
		bpy.utils.unregister_class(c)

	

